package service

import (
	"errors"
	"fmt"

	"example.com/m/v2/model/mysql"
	"github.com/dgrijalva/jwt-go"
)

type Token struct {
	BaseService
	Secret string `json:"secret"`
}

func NewToken(svcCtx *ServiceContext, secret string) *Token {
	return &Token{Secret: secret}
}

// 生成 JWT 令牌的函数
func (t *Token) Generate(user *mysql.User) (string, error) {
	// 设置令牌声明
	claims := jwt.MapClaims{
		"userId": user.Id,
	}

	// 创建令牌
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// 签署令牌
	signedToken, err := token.SignedString(t.generateKey())
	if err != nil {
		return "", err
	}

	return signedToken, nil
}

// 解析 JWT 令牌的函数
func (t *Token) Parse(tokenString string) (jwt.MapClaims, error) {
	// 解析令牌
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Method)
		}
		return t.generateKey(), nil
	})
	if err != nil {
		return nil, err
	}

	// 验证
	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		return claims, nil
	}
	return nil, errors.New("无效的令牌")
}

func (t *Token) generateKey() []byte {
	return []byte(t.Secret)
}
